package leetcode;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

class Solution_47 {

	public List<List<Integer>> permuteUnique(int[] nums) {

		Set<List<Integer>> res = new HashSet<List<Integer>>();
		List<Integer> temp = new ArrayList<Integer>();
		boolean[] flags = new boolean[nums.length];

		dfs(res, temp, nums, flags, 0);

		return new ArrayList<List<Integer>>(res);
	}

	private void dfs(Set<List<Integer>> res, List<Integer> temp, int[] nums, boolean[] flags, int i) {
		if (i == nums.length) {
			res.add(new ArrayList<Integer>(temp));
		}
		for (; i < nums.length; i++) {
			if (!flags[i]) {
				temp.add(nums[i]);
				flags[i] = true;
				dfs(res, temp, nums, flags, i + 1);
				temp.remove(temp.size() - 1);
				flags[i] = false;
			}
		}
	}

}